package com.tmxk.api.days01.lf.list;

import java.util.ArrayList;

public class ArrrayListDemo {
    public static void main(String[] args) {
        //需求: 一堆数据  1  -9  你好  false  9.99  男
        //数组定义
        Object[] nums = {1,-9,"你好",false,9.99 ,"男"};

        //集合框架中所有集合包都是在java.util包下
        //new ArrayList() 等于Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA ={},在内存中开辟一个空间
        ArrayList arrayList = new ArrayList();
        /**
         * 集合添加元素方法
         * 集合名.add(对象元素);  建议使用该方式添加集合元素
         * 集合名.add(下标位置,对象元素);  通过下标位置添加集合元素需注意:指定下标位置必须依次存在(集合下标位置不能大于集合元素大小)
         */
        /**ArrayList集合元素中调用add方法时,底层程序进行 自动扩容,自动扩容的原理是
         *  ①当前元素大小为0时,底层自动开辟10个容量大小空间进行数据存储
         *  ②当默认开辟的10个容量大小使用完毕后,会根据当前集合元素的大小自动扩容到1.5倍
         *          底层代码：grow(minCapacity);
         *                             private void grow(int minCapacity) {
         *                             // overflow-conscious code
         *                             int oldCapacity = elementData.length;
         *                             int newCapacity = oldCapacity + (oldCapacity >> 1);
         *                             if (newCapacity - minCapacity < 0)
         *                             newCapacity = minCapacity;
         *                             if (newCapacity - MAX_ARRAY_SIZE > 0)
         *                             newCapacity = hugeCapacity(minCapacity);
         *                             // minCapacity is usually close to size, so this is a win:
         *                             elementData = Arrays.copyOf(elementData, newCapacity);
         *                           }
         *  ③以此类推,自动扩容的容量大小使用完毕后,再根据当前集合元素的大小自动扩容到1.5倍
         */
        arrayList.add(1);
        arrayList.add(1,-9);
        //java.lang.IndexOutOfBoundsException   下标超出指定范围
        arrayList.add("你好");


        //集合获取大小:集合对象名.size();
        System.out.println("ArrayList集合元素的大小(长度)" + arrayList.size());

        //获取集合对象方法: 集合对象名.get(index);
        System.out.println("ArrayList集合第一个元素:" + arrayList.get(0));
        System.out.println("ArrayList集合第二个元素:" + arrayList.get(1));
        System.out.println("ArrayList集合第三个元素:" + arrayList.get(2));

        //E (集合元素 Element)  T (数据类型 Type)  K(键 Key)  V(值 Value)
        //ArrayList集合框架元素默认容量大小  10个

        //需求1:判断当前集合元素中是否存在  你好1 元素
        boolean isFind =arrayList.contains("你好1");
        String message = isFind == true ? "存在该集合元素" : "不存在该集合元素";
        System.out.println(message);
        //循环遍历下ArrayList集合元素  方式一:
        System.out.println("-------ArrayList集合元素遍历方式一");
        for(int i = 0;i < arrayList.size();i++){
            System.out.println(arrayList.get(i));
        }

        //需求2:删除当前集合元素中 1 数据     集合对象名.remove(index);返回 元素对象类型    集合对象名.remove(obj);  返回boolean类型
        arrayList.remove(arrayList.get(0));
        //循环遍历下ArrayList集合元素  方式二: 使用foreach 下标遍历
        System.out.println("--------ArrayList集合遍历方式二  foreach");
        for(Object obj : arrayList){
            System.out.println(obj);
        }
    }
}
